/* 
 * Viatura.java
 * 
 * Data de criação: 05/09/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.integration.entidade;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import br.com.o2solutions.core.integration.repository.entity.BaseEntity;

/**
 * Classe responsável por representar uma {@link Viatura} para atendimento as
 * {@link Ocorrencia}s operacionais.Pode estar vinculada a uma
 * {@link UnidadeOperacional} (U.O) ou não. Caso não esteja vinculada a uma U.O
 * a {@link Viatura} não pode ser utilizada para atendimento as ocorrências.
 * 
 * @author Osvaldeir
 * @since 05/09/2010
 * 
 */
@Entity
@Table(name = "TBVIATURA")
@SequenceGenerator(name = "SQVIATURA", sequenceName = "SQVIATURA")
@SQLDelete(sql = "UPDATE TBVIATURA SET REMOVIDA = 'true' WHERE VIATURAID = ?")
@Where(clause = "removida IS NULL OR removida = 'false'")
@EntityListeners(value = { br.com.o2solutions.siso.integration.event.MovimentacaoViaturaEvent.class })
public class Viatura extends BaseEntity<Integer> {

	private static final long serialVersionUID = 1L;

	private String prefixo;

	private String placa;

	private Integer fabricacao;

	private Integer modelo;

	private Boolean ativa;

	private Boolean removida;

	private Integer quantidadeOcupantes;

	private UnidadeOperacional unidadeOperacional;

	private Set<ViaturaUnidadeOperacional> historico;
	
	private Set<ObservacaoViatura> observacoesViatura;

	/**
	 * Retorna a quantidadeOcupantes.
	 * 
	 * @return the quantidadeOcupantes
	 */
	@Column(name = "QUANTIDADEOCUPANTES", nullable = true)
	public Integer getQuantidadeOcupantes() {
		return quantidadeOcupantes;
	}

	/**
	 * Atribui a quantidadeOcupantes. Define a quantidade de pessoas a estarem
	 * relacionadas a viatura no momento do atendimento a uma {@link Ocorrencia}
	 * .
	 * 
	 * @param quantidadeOcupantes
	 *            the quantidadeOcupantes to set
	 */
	public void setQuantidadeOcupantes(Integer quantidadeOcupantes) {
		this.quantidadeOcupantes = quantidadeOcupantes;
	}

	@Id
	@Column(name = "VIATURAID")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQVIATURA")
	@Override
	public Integer getId() {
		return super.getId();
	}

	/**
	 * Retorna o(a) prefixo.
	 * 
	 * @return String
	 */
	@Column(name = "PREFIXO", length = 10, nullable = false)
	public String getPrefixo() {
		return prefixo;
	}

	/**
	 * Atribui o(a) prefixo.
	 * 
	 * @param prefixo
	 *            String
	 */
	public void setPrefixo(String prefixo) {
		this.prefixo = prefixo;
	}

	/**
	 * Retorna o(a) placa.
	 * 
	 * @return String
	 */
	@Column(name = "PLACA", length = 10, nullable = false)
	public String getPlaca() {
		return placa;
	}

	/**
	 * Atribui o(a) placa.
	 * 
	 * @param placa
	 *            String
	 */
	public void setPlaca(String placa) {
		this.placa = placa;
	}

	/**
	 * Retorna o(a) ano.
	 * 
	 * @return Integer
	 */
	@Column(name = "FABRICACAO", nullable = false)
	public Integer getFabricacao() {
		return fabricacao;
	}

	/**
	 * Atribui o(a) ano.
	 * 
	 * @param ano
	 *            Integer
	 */
	public void setFabricacao(Integer ano) {
		this.fabricacao = ano;
	}

	/**
	 * Retorna o(a) ativa.
	 * 
	 * @return Boolean
	 */
	@Column(name = "ATIVA", nullable = false)
	public Boolean getAtiva() {
		return ativa;
	}

	/**
	 * Atribui o(a) ativa.
	 * 
	 * @param ativa
	 *            Boolean
	 */
	public void setAtiva(Boolean ativa) {
		this.ativa = ativa;
	}

	/**
	 * Retorna o(a) modelo.
	 * 
	 * @return Integer
	 */
	@Column(name = "MODELO", nullable = false)
	public Integer getModelo() {
		return modelo;
	}

	/**
	 * Atribui o(a) modelo.
	 * 
	 * @param modelo
	 *            Integer
	 */
	public void setModelo(Integer modelo) {
		this.modelo = modelo;
	}

	/**
	 * Retorna o(a) removida.
	 * 
	 * @return Boolean
	 */
	@Column(name = "REMOVIDA", nullable = true)
	public Boolean getRemovida() {
		return removida;
	}

	/**
	 * Atribui o(a) removida.
	 * 
	 * @param removida
	 *            Boolean
	 */
	public void setRemovida(Boolean removida) {
		this.removida = removida;
	}

	/**
	 * Retorna o(a) unidadeOperacional.
	 * 
	 * @return UnidadeOperacional
	 */
	@ManyToOne
	@JoinColumn(name = "UNIDADEOPERACIONALID", nullable = true)
	public UnidadeOperacional getUnidadeOperacional() {
		return unidadeOperacional;
	}

	/**
	 * Atribui o(a) unidadeOperacional.
	 * 
	 * @param unidadeOperacional
	 *            UnidadeOperacional
	 */
	public void setUnidadeOperacional(UnidadeOperacional unidadeOperacional) {
		this.unidadeOperacional = unidadeOperacional;
	}

	/**
	 * Retorna o(a) historico.
	 * 
	 * @return Set<ViaturaUnidadeOperacional>
	 */
	@OneToMany(mappedBy = "viatura", cascade = { CascadeType.PERSIST,
			CascadeType.MERGE })
	public Set<ViaturaUnidadeOperacional> getHistorico() {
		if (historico == null) {
			historico = new HashSet<ViaturaUnidadeOperacional>();
		}

		return historico;
	}

	/**
	 * Atribui o(a) historico.
	 * 
	 * @param historico
	 *            Set<ViaturaUnidadeOperacional>
	 */
	public void setHistorico(Set<ViaturaUnidadeOperacional> historico) {
		this.historico = historico;
	}

	/**
	 * Retorna o(a) observacoesViatura.
	 * 
	 * @return Set<ObservacaoViatura>
	 */
	@OneToMany(mappedBy="viatura")
	public Set<ObservacaoViatura> getObservacoesViatura() {
		return observacoesViatura;
	}

	/**
	 * Atribui o(a) observacoesViatura.
	 *
	 * @param observacoesViatura Set<ObservacaoViatura>
	 */
	public void setObservacoesViatura(Set<ObservacaoViatura> observacoesViatura) {
		this.observacoesViatura = observacoesViatura;
	}
}
